package pe.gob.osce.sirenas.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import pe.gob.osce.sirenas.dao.NotificacionesDAOLocal;
import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.jpa.Auditoria;
import pe.gob.osce.sirenas.model.jpa.Notificaciones;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;

@Stateless
public class NotificacionDAOImpl implements NotificacionesDAOLocal {

	@PersistenceContext(unitName="pe.gob.osce.sirenas.be.pu" )
	private	EntityManager	em;
	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);
		
	@Override
	public Notificaciones insertNotificacion(Notificaciones notificaciones)throws Exception {
		try{
			em.merge(notificaciones);
			em.flush();
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
		return notificaciones;
	}


	@Override 
	public List<Notificaciones> consultarNotificaciones(Long idFicha)
			throws Exception {
		List<Notificaciones>		listNotificacionesJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT noti FROM Notificaciones noti WHERE NVL(noti.idFicha,0) IN ( :idFicha, 0) ");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFicha", idFicha);
			
			List<Notificaciones> listaObjeto=query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				listNotificacionesJPA=new ArrayList<Notificaciones>();
				for (Notificaciones obj: listaObjeto) {					
					listNotificacionesJPA.add(obj);
				}				
			}
		} catch (NoResultException nre) {
			listNotificacionesJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		
		return listNotificacionesJPA;
	}	

	@Override
	public Notificaciones actualizarNotificacion(Notificaciones notificaciones,Auditoria auditoria )
			throws Exception {
		
		try {
			StringBuilder jpql = new StringBuilder();

			jpql.append(" UPDATE Notificaciones noti ");
			jpql.append(" SET noti.indLectura = :indLectura ");
			jpql.append(" ,noti.auditoria.fechaModifica = :fechaModifica ");
			jpql.append(" ,noti.auditoria.usuarioModifica = :usuarioModifica ");
			
			jpql.append(" WHERE noti.idNotificacion = :idNotificacion ");
			
			Query query = em.createQuery(jpql.toString());
			query.setParameter("indLectura", notificaciones.isIndLectura());			
			query.setParameter("fechaModifica", auditoria.getFechaModifica());
			query.setParameter("usuarioModifica", auditoria.getUsuarioModifica());
			query.setParameter("idNotificacion", notificaciones.getIdNotificacion());
			
			query.executeUpdate();
			
			
		} catch (Exception e) {
			notificaciones=null;
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
		
		return notificaciones;
	}
	


	@Override 
	public String obtieneCorreosNotificacion(Long idPersona) throws Exception {
		String correos="";
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT lcom.descripcionDetalle FROM Persona per JOIN per.listaComunicaciones lcom WHERE lcom.idPersona=per.idPersona AND lcom.indTipoComunicacion IN(163,164) AND per.idPersona = :idPersona ");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idPersona", idPersona);
			
			List<String> listaObjeto=query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				for (String comunicacion: listaObjeto) {					
					correos+=comunicacion+" ";
				}				
			}
		} catch (NoResultException nre) {
			correos="";
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return correos;
	}
}
